<?php

namespace app\validate;

use think\Validate;

use app\model\{
    User,
    GoodType,
    Supplier
};


class BaseValidate extends Validate
{
    // 验证值在某个数据表中存在，如果传 null/0/'0' 均不做验证
    // checkRecord:User 验证在User模型中存在该id
    // checkRecord:User,name 也可以指定其他字段，不指定时默认取该模型的pk()
    public function checkRecord($value, $rule, $data, $key, $key_desc)
    {
        if (!$value || $value == '0') return true;

        $rule = explode(',', $rule);
        $modelName = $rule[0];
        if (!class_exists($modelName)) {
            $modelName = 'app\model\\' . $modelName;
            if (!class_exists($modelName)) throw new \RuntimeException('in BaseValidate checkRecord(), class ' . $modelName . ' not exist');
        }
        $model = new $modelName();

        $field = $rule[1] ?? $model->getPk();
        if ($model->where($field, $value)->find()) return true;

        return $key_desc . '不存在';
    }

    // 类似checkRecord，区别是验证的是ID数组
    public function checkRecords($value, $rule, $data, $key, $key_desc)
    {
        if (!is_array($value) || empty($value)) return true;

        foreach ($value as $it) {
            $check = $this->checkRecord($it, $rule, $data, $key, $key_desc);
            if ($check !== true) return $key_desc . '中的' . $it . '不存在';
        }
        return true;
    }

    // 坐标经度
    protected function checkPosLng($value, $rule, $data, $key, $key_desc)
    {
        if (!$value) return true;
        return $value >= -180 && $value <= 180 ? true : $key_desc . '必须在-180~180之间';
    }

    // 坐标纬度
    protected function checkPosLat($value, $rule, $data, $key, $key_desc)
    {
        if (!$value) return true;
        return $value >= -90 && $value <= 90 ? true : $key_desc . '必须在-90~90之间';
    }
}
